/* 
 * File:   lectura.h
 * Author: bastian
 *
 * Created on 7 de mayo de 2011, 20:33
 */


#ifndef STDIO_H
#include <stdio.h>
#define STDIO_H
#endif

#ifndef MATH_H
#include <math.h>
#define MATH_H
#endif

#ifndef STDLIB_H
#include <stdlib.h>
#define STDLIB_H
#endif

#ifndef STRING_H
#include <string.h>
#define STRING_H
#endif

#ifndef MATRICES_H
#include "Matrices.h"
#define MATRICES_H
#endif

#define true 0
#define false 1;

void creaFraccion(char *numero, Fraccion *fra);
void StringToFraccion(char *numero, int esEntero,Fraccion *fra);
void StringDecimalToFraccion(char *numero,Fraccion *fra);
int cantidadCifras(int numero);


void creaFraccion(char *numero, Fraccion *fra){

    
    int len = strlen(numero);
    
    for(int i = 0; i< len ; i++){
        if(numero[i]=='.'){
            StringDecimalToFraccion(numero,fra);
            return;
        }
        
        else if(numero[i]=='/'){
            StringToFraccion(numero,0,fra);
            return;
        }
    }
    
    StringToFraccion(numero,1,fra);
    
}

void StringToFraccion(char *numero, int esEntero,Fraccion *fra){
    
    char slash[2]="/";
    char *ptr;
    int numerador,denominador;
    
    if(esEntero==1){
        Fraccion_setValue(fra,atoi(numero),1);
    }
    else{
        ptr = strtok(numero,slash);
        numerador = atoi(ptr);
        while( (ptr = strtok( NULL, slash )) != NULL ) {   
                denominador = atoi(ptr);   
        }
        Fraccion_setValue(fra,numerador,denominador);
        
    }
    Fraccion_Simplificar(fra);

}

void StringDecimalToFraccion(char *numero,Fraccion *fra){
    
    int entera,decimal,CifrasDecimales=0,negativo;
    int numerador,denominador=1;
    
    negativo = (numero[0]=='-')? -1 : 1;
    
    char punto[2]=".";
    char *ptr;
    
    ptr = strtok(numero,punto);
    entera = (int)fabs(atoi(ptr));
    
    while( (ptr = strtok( NULL, punto )) != NULL ) {   // Posteriores llamadas
        decimal = atoi(ptr);
        CifrasDecimales = strlen(ptr);
    }
    
    for(int i =0; i<CifrasDecimales; i++ ){
        denominador*=10;        
    }
    
    numerador = ((denominador*entera) + decimal) * negativo;
    
    Fraccion_setValue(fra,numerador,denominador);
    Fraccion_Simplificar(fra);
    
    
    

}


void creaMatriz(char *Entrada, Matriz *mat){
    
    char numeros[(mat->columnas*mat->filas)][50];
    char patron[4] = ",;";
    char *ptr;
    int a = 1;
    
    ptr = strtok( Entrada, patron ); 
    strcpy(numeros[0],ptr);
    //printf("\nptr: %s",ptr);
    
    while( (ptr = strtok( NULL, patron )) != NULL ){    // Posteriores llamadas
       //printf("\nptr: %s",ptr);
        if(a < (mat->columnas*mat->filas) ){
           strcpy(numeros[a],ptr);
           a++;
       }
   }
   
  
    int b=0,c=0;
    
    for(int i = 0; i < (mat->columnas*mat->filas) ; i++){
       
        //printf("\nnumeros[%i]= %s | b,c --> %i,%i",i,numeros[i],b,c);
        creaFraccion(numeros[i],&mat->elementos[b][c]);
        
        if(c < mat->columnas -1)
            c++;
        
        else{
            c=0;
            b++;
        }
    }
    
    //printf("\n\n");
    //Matriz_Mostrar(mat);
 
    

}

int cantidadCifras(int numero){
    int cifras=0;
    
    
    while(numero!=0){
        numero/=10;
        cifras++;
        
    }
    return cifras;
}

void LimpiarIndices(int *indices,int tamano){
	
		for (int i = 0; i < tamano; i++)
		{
			indices[i]=-1;
		}
}